package Objects;

import java.awt.*;
import javax.swing.ImageIcon;

// Esta classe representa um defensor no jogo.
public class Shooter {
	// Posicao do defensor em pixels.  
	private int x,y;
	// Tamanho do defensor em pixels.
	private int iw,ih;
	// Imagem do defensor.
	private Image icon;
	// Area do painel do jogo (para controlar movimento).  
	private Dimension area;
	private int velocidade = 5;
	private double lifeBar;
	private boolean estaAtivo;
	private Image iconWalkLeft;
	private Image iconWalkRight;
	private Image iconWalkUp;
	private Image iconWalkDown;
	private Image iconHit;
	private Image iconShoot;
	//private Image iconStop;
	private Estado estado;
	private int contPosShoot;
	private int contPosHit;

	// Construtor, inicializa atributos e posiciona o shooter.
	public Shooter(Dimension a) {
		lifeBar = 100;
		estaAtivo = true;
	    area = a;
	    contPosShoot = 0;
	    contPosHit = 20;
	    initIcons();
	    icon = new ImageIcon(getClass().getResource("/Sprites/thorshoot.gif")).getImage();
	    iw = icon.getWidth(null);
	    ih = icon.getHeight(null);
	    // x e y iniciais centrados na área de movimentação.
	    x = (int)(iw/2+(a.width-iw)/2);
	    y = (int)(a.getHeight()-90);
    }
  
	  public void initIcons() {
		  iconWalkLeft = new ImageIcon(getClass().getResource("/Sprites/thorwalkleft.gif")).getImage();
		  iconWalkRight = new ImageIcon(getClass().getResource("/Sprites/thorwalkright.gif")).getImage();
		  iconWalkUp = new ImageIcon(getClass().getResource("/Sprites/thorwalkup.gif")).getImage();
		  iconWalkDown = new ImageIcon(getClass().getResource("/Sprites/thorwalkdown.gif")).getImage();
		  iconHit = new ImageIcon(getClass().getResource("/Sprites/thorhit.gif")).getImage();
		  iconShoot = new ImageIcon(getClass().getResource("/Sprites/thorshoot.gif")).getImage();
		  //iconStop = new ImageIcon(getClass().getResource("/Sprites/thorstopleft.gif")).getImage();
	  }
  
	  // Método que movimenta o shooter, verificando se está na área válida.
	  public void move(Estado estado) {
		  
		  this.estado = estado;
		  if (estado == null) {
			  return;
		  }
		  if(contPosShoot <= 20) {
			  icon = iconShoot;
			  contPosShoot++;
		  }
		  else {
			  if(contPosHit <= 20) {
				  icon = iconHit;
				  contPosHit++;
			  }
			  else {
				  contPosShoot++;
				  contPosHit++;
				  switch(estado) {
			      		case LEFT: 
				        	icon = iconWalkLeft;
				        	x-=velocidade;
				        	if (x < 0) {
				        		x = 0;
				        	}
				        	break;
			      		case RIGHT: 
				        	icon = iconWalkRight;
				        	x+=velocidade; 
				        	if (x > area.width-iw) { 
				        		x = area.width-iw; 
				        	}
				        	break;
			      		case UP: 
					        icon = iconWalkUp;
					        y-=velocidade; 
					        if (y < 0) {
					        	y = 0; 
					        }
					        break;
			      		case DOWN:
				        	icon = iconWalkDown;
				        	y+=velocidade; 
				        	if (y > area.height-ih) {
				        		y = area.height-ih; 
				        	}
				        	break;
				}
	    	}
	  	}
	}
  
  	// Método que desenha o shooter em um contexto gráfico. 
  	public void draw(Graphics g) {
	  	if (estaAtivo) {
	  		g.drawImage(icon,x,y,null);
	  	}
    }
  
  	public int getX() { 
  		return x; 
	}
	
  	public int getY() { 
  		return y; 
	}
	
  	public int getWidth() { 
  		return iw; 
	}
	
  	public int getHeight() { 
  		return ih; 
	}
  
  	public void desativa() {
	  	estaAtivo = false;
  	}
  
  	// X medio da imagem para colisao
  	public int getXm() {
	 	return x +iw/2;
  	}
  
  	// Y medio da imagem para colisao
  	public int getYm() {
		  return y +iw/2;
	}
  
  	// Esta ativo?
  	public boolean getEstaAtivo() {
	  	return estaAtivo;
  	}
  
  	// Perde vida
  	public void perdeVida(double x) {
		  lifeBar -= x;
  	}
  
  	public boolean estaSemLife() {
  		if(lifeBar <= 0) {
  			desativa();
			return true;
		}
  		return false;
  	}

  	public double getLifeBar() {
  		return lifeBar;
  	}
  
  	public void setIcon() {
  		icon = iconShoot;
  	}
  
  	public Estado getEstado() {
  		return estado;
  	}
  
  	public void setEstado(Estado estado) {
  		this.estado = estado;
  	}
  
  	public void zeraContPosShoot() {
  		contPosShoot = 0;
  	}
  
  	public void zeraContPosHit() {
	  contPosHit = 0;
  	}
}